#include "bsp.h"
char dispBuf[100];
OV2640_IDTypeDef OV2640_Camera_ID;
void led_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    // LED0 PF9 PF10
    // 1、时钟使能
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

    // 2、配置GPIO
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
    GPIO_Init(GPIOF,&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_Init(GPIOF,&GPIO_InitStruct);

    // 3、使能GPIO
    GPIO_ResetBits(GPIOF,GPIO_Pin_9);
    GPIO_ResetBits(GPIOF,GPIO_Pin_10);
}


void button_exti_init(void)
{
    // PA0 高电平有效
    // 设置位默认低电平(下拉)
    GPIO_InitTypeDef GPIO_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    // 1、时钟使能
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    // 2、配置GPIO 输入 开漏 下拉
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
    GPIO_Init(GPIOF,&GPIO_InitStruct);

    // 配置EXII
    // 配置映射
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
    // 配置为中断 上升沿触发 
    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; 
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStruct);

    // 配置NVIC
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

void bsp_init(void)
{
    // 中断优先级分组 2 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    led_init();
    button_exti_init();
		
    // USART初始化
    bsp_InitUart();

    // eeprom初始化
    bsp_eeprom_at24cxx_Init();

    // adc初始化
    bsp_adc_init();

    // spi flash初始化
    bsp_spi_flash_w25qxx_Init();
		
    // sram初始化
    FSMC_SRAM_Init();

    // lcd初始化
    ILI9341_Init();

    // 触摸屏初始化
    XPT2046_Init();

    // 液晶扫描方向
    ILI9341_GramScan ( 5 );	
    LCD_SetFont(&Font16x24);
    LCD_SetColors(RED,BLACK);
    ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);	/* 清屏，显示全黑 */

    /* 初始化摄像头GPIO及IIC */
    OV2640_HW_Init();   
    /* 读取摄像头芯片ID，确定摄像头正常连接 */
    OV2640_ReadID(&OV2640_Camera_ID);
    printf(" 获取ID1  %x \n",OV2640_Camera_ID.Manufacturer_ID1);
    printf(" 获取ID2  %x \n",OV2640_Camera_ID.Manufacturer_ID2);
    printf(" 获取PIDH %x \n",OV2640_Camera_ID.PIDH);
    printf(" 获取PIDL %x \n",OV2640_Camera_ID.PIDL);
    if(OV2640_Camera_ID.PIDH  == 0x26)
    {
        sprintf(dispBuf, "OV2640 camera,ID:0x%x", OV2640_Camera_ID.PIDH);
        ILI9341_DispStringLine_EN(LINE(0),dispBuf);
        // CAMERA_DEBUG("检测到摄像头 %x %x",OV2640_Camera_ID.Manufacturer_ID1 ,OV2640_Camera_ID.Manufacturer_ID2);

    }
    else
    {
        LCD_SetTextColor(RED);
        ILI9341_DispString_EN(10,10,"Can not detect OV2640 module,please check the connection!");
        // CAMERA_DEBUG("没有检测到OV2640摄像头，请重新检查连接。");

        while(1);  
    }
    /*使用寄存器表初始化摄像头*/
    OV2640_Init();
    OV2640_UXGAConfig(); 

}




void bsp_idle(void)
{
    
}

